//
// Created by zy-li14 on 16-9-24.
//

#ifndef AI9_LOGIC_2017_ACTMAKER_H
#define AI9_LOGIC_2017_ACTMAKER_H
#include <set>
#include "AbstractActMaker.h"
#include "sdk/sdk.h"

#ifdef Windows
#include <windows.h>
#else
#include <dlfcn.h>
#endif

class Operation;
class PlayerInfo;
template <const char* funcName, typename... Types>
class ActMaker : public AbstractActMaker<Types...> {
public:

    using OperationSet = std::set<Operation>;
    using AiFunction = void (*)(Types... args);
    ActMaker() = default;
    ActMaker(const char* file_name);

     /************************************
     * 执行AI，得到玩家的决策结果。
     * 需要处理玩家AI崩溃等异常情况，保证总是能返回结果。
     * @param info 表示这个玩家的个人信息和他可见的其他玩家的信息
     * @param cmd AI返回的决策将加入这个对象中。
     * @return true表示AI正常执行完操作。false表示AI崩溃，超时等异常情况。
     */
     virtual bool getCommand(Types... args);


    bool load(const char *file_name);//通过指定路径加载动态链接库

    ~ActMaker();

    int playerId;
private:

protected:
#ifdef Windows
    HMODULE dll;
#else
    void* dll;
#endif
    AiFunction player_ai;
};

extern char const player_aiString[];
extern char const feedback_aiString[];

#endif //AI9_LOGIC_2017_ACTMAKER_H
